REST ๋ฐ GraphQL API๋ฅผ ์ํ API ํ ์คํ ์ ๋ต์ ํ์ํ๊ณ , ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ๋ณด์ฅํ๊ธฐ ์ํ ํ์ ๊ธฐ์ , ๋๊ตฌ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
API ํ ์คํ : REST์ GraphQL์ ๋ํ ์ข ํฉ ๊ฐ์ด๋
์ค๋๋ ์ํธ ์ฐ๊ฒฐ๋ ๋์งํธ ํ๊ฒฝ์์ API(์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค)๋ ํ๋ ์ํํธ์จ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ถ์ ๋๋ค. API๋ ์๋ก ๋ค๋ฅธ ์์คํ ๊ฐ์ ํต์ ๊ณผ ๋ฐ์ดํฐ ๊ตํ์ ์ด์งํ์ฌ ์ํํ ํตํฉ๊ณผ ๊ธฐ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. API์ ์ค์์ฑ์ด ์ ์ ๋ ์ปค์ง์ ๋ฐ๋ผ, ์๊ฒฉํ ํ ์คํธ๋ฅผ ํตํด API์ ์ ๋ขฐ์ฑ, ์ฑ๋ฅ ๋ฐ ๋ณด์์ ๋ณด์ฅํ๋ ๊ฒ์ด ๋ฌด์๋ณด๋ค ์ค์ํฉ๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋์์๋ REST ๋ฐ GraphQL API ๋ชจ๋์ ๋ํ API ํ ์คํ ์ ๋ต์ ํ์ํ๊ณ ํ์ ๊ธฐ์ , ๋๊ตฌ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
API ํ ์คํ ์ด๋ ๋ฌด์์ธ๊ฐ?
API ํ ์คํ ์ API์ ๊ธฐ๋ฅ, ์ ๋ขฐ์ฑ, ์ฑ๋ฅ ๋ฐ ๋ณด์์ ๊ฒ์ฆํ๋ ๋ฐ ์ค์ ์ ๋ ์ํํธ์จ์ด ํ ์คํ ์ ํ ์ ํ์ ๋๋ค. ๊ธฐ์กด์ UI ๊ธฐ๋ฐ ํ ์คํ ๊ณผ ๋ฌ๋ฆฌ, API ํ ์คํ ์ ๋ฉ์์ง ๊ณ์ธต์์ ์๋ํ๋ฏ๋ก ํ ์คํฐ๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ์์กดํ์ง ์๊ณ API ์๋ํฌ์ธํธ์ ์ง์ ์ํธ ์์ฉํ๊ณ ๋์์ ํ์ธํ ์ ์์ต๋๋ค.
API ํ ์คํ ์ ์ฃผ์ ์ธก๋ฉด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ธฐ๋ฅ ํ ์คํ : ๋ฐ์ดํฐ ์กฐํ, ์์ฑ, ์์ ๋ฐ ์ญ์ ๋ฅผ ํฌํจํ์ฌ API๊ฐ ์๋ํ ๊ธฐ๋ฅ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ๋์ง ํ์ธํฉ๋๋ค.
- ์ ๋ขฐ์ฑ ํ ์คํ : ์ค๋ฅ, ์์ธ ๋ฐ ์์์น ๋ชปํ ์ ๋ ฅ์ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ API์ ๋ฅ๋ ฅ์ ํ๊ฐํฉ๋๋ค.
- ์ฑ๋ฅ ํ ์คํ : ๋ค์ํ ๋ถํ ์กฐ๊ฑด์์ API์ ์๋ต ์๊ฐ, ์ฒ๋ฆฌ๋ ๋ฐ ํ์ฅ์ฑ์ ํ๊ฐํฉ๋๋ค.
- ๋ณด์ ํ ์คํ : ์ธ์ฆ ๊ฒฐํจ, ๊ถํ ๋ถ์ฌ ์ฐํ ๋ฐ ๋ฐ์ดํฐ ์ฃผ์ ๊ณต๊ฒฉ๊ณผ ๊ฐ์ ์ทจ์ฝ์ ์ ์๋ณํฉ๋๋ค.
API ํ ์คํ ์ด ์ค์ํ ์ด์ ๋ ๋ฌด์์ธ๊ฐ?
API ํ ์คํ ์ ์ฌ๋ฌ ๊ฐ์ง ์ค์ํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ์กฐ๊ธฐ ๋ฒ๊ทธ ๋ฐ๊ฒฌ: ๊ฐ๋ฐ ์๋ช ์ฃผ๊ธฐ ์ด๊ธฐ์ ๊ฒฐํจ์ ์๋ณํ์ฌ ์์ ์ ํ์ํ ๋น์ฉ๊ณผ ๋ ธ๋ ฅ์ ์ค์ ๋๋ค.
- ์ํํธ์จ์ด ํ์ง ํฅ์: API์ ์ ๋ขฐ์ฑ๊ณผ ์์ ์ฑ์ ๋ณด์ฅํ์ฌ ๋ ๋์ ํ์ง์ ์ํํธ์จ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ญ๋๋ค.
- ์์ฅ ์ถ์ ์๊ฐ ๋จ์ถ: API์ UI ๊ตฌ์ฑ ์์์ ๋ณ๋ ฌ ํ ์คํธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํฉ๋๋ค.
- ํ ์คํ ๋น์ฉ ์ ๊ฐ: API ํ ์คํธ๋ฅผ ์๋ํํ์ฌ ์๋ ์์ ์ ์ค์ด๊ณ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ฐ์ ํฉ๋๋ค.
- ๋ณด์ ๊ฐํ: API์ ๋ณด์ ์ทจ์ฝ์ ์ ์๋ณํ๊ณ ์ํํ์ฌ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ณ ๋ฌด๋จ ์ ๊ทผ์ ๋ฐฉ์งํฉ๋๋ค.
REST API ํ ์คํ
REST(Representational State Transfer)๋ ๋คํธ์ํฌ ์ ํ๋ฆฌ์ผ์ด์ ์ค๊ณ๋ฅผ ์ํ ์ํคํ ์ฒ ์คํ์ผ์ ๋๋ค. REST API๋ ํ์ค HTTP ๋ฉ์๋(GET, POST, PUT, DELETE)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค์ ์ ๊ทผํ๊ณ ์กฐ์ํฉ๋๋ค. REST API ํ ์คํ ์ ์ด๋ฌํ ๋ฉ์๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๊ณ REST ์์น์ ์ค์ํ๋์ง ํ์ธํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
REST API ํ ์คํ ๊ธฐ๋ฒ
- ๊ธฐ๋ฅ ํ
์คํ
:
- ๋ฆฌ์์ค ์์ฑ: ์ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด POST ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต ์ํ ์ฝ๋(์: 201 Created)๋ฅผ ํ์ธํฉ๋๋ค.
- ๋ฆฌ์์ค ์กฐํ: ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ์กฐํํ๊ธฐ ์ํด GET ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต ๋ณธ๋ฌธ๊ณผ ์ํ ์ฝ๋(์: 200 OK)๋ฅผ ํ์ธํฉ๋๋ค.
- ๋ฆฌ์์ค ์์ : ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด PUT ๋๋ PATCH ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต ์ํ ์ฝ๋(์: 200 OK ๋๋ 204 No Content)๋ฅผ ํ์ธํฉ๋๋ค.
- ๋ฆฌ์์ค ์ญ์ : ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด DELETE ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต ์ํ ์ฝ๋(์: 204 No Content)๋ฅผ ํ์ธํฉ๋๋ค.
- ์ ํจ์ฑ ๊ฒ์ฌ ํ
์คํ
:
- ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ: API๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฐ์ดํฐ ์ ํ, ํ์ ๋ฐ ๊ฐ์ ๋ฐํํ๋์ง ํ์ธํฉ๋๋ค.
- ์คํค๋ง ์ ํจ์ฑ ๊ฒ์ฌ: API ์๋ต์ด ์ ์๋ ์คํค๋ง(์: OpenAPI Specification)๋ฅผ ์ค์ํ๋์ง ํ์ธํฉ๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ์ ํจํ์ง ์์ ์์ฒญ์ด๋ ์์์น ๋ชปํ ์กฐ๊ฑด์ ๋ํด API๊ฐ ์ ์ ํ ์ค๋ฅ ๋ฉ์์ง์ ์ํ ์ฝ๋๋ฅผ ๋ฐํํ๋์ง ํ์ธํฉ๋๋ค.
- ๋ณด์ ํ
์คํ
:
- ์ธ์ฆ ํ ์คํ : ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ๊ธฐ ์ํด API๊ฐ ์ ์ ํ ์ธ์ฆ ์๊ฒฉ ์ฆ๋ช (์: API ํค, OAuth ํ ํฐ)์ ์๊ตฌํ๋์ง ํ์ธํฉ๋๋ค.
- ๊ถํ ๋ถ์ฌ ํ ์คํ : ์ฌ์ฉ์๊ฐ ์ ๊ทผ ๊ถํ์ด ์๋ ๋ฆฌ์์ค์๋ง ์ ๊ทผํ ์ ์๋์ง ํ์ธํฉ๋๋ค.
- ์ ๋ ฅ ์ ํจ์ฑ ๊ฒ์ฌ: ์ฌ์ฉ์ ์ ๋ ฅ์ ๊ฒ์ฆํ๊ณ ์ฒ๋ฆฌ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ด๊ท (sanitizing)ํ์ฌ ๋ฐ์ดํฐ ์ฃผ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ฑ๋ฅ ํ
์คํ
:
- ๋ถํ ํ ์คํ : ๋ง์ ์์ ๋์ ์ฌ์ฉ์๋ฅผ ์๋ฎฌ๋ ์ด์ ํ์ฌ ๊ณผ๋ํ ๋ถํ ์ํ์์ API์ ์ฑ๋ฅ์ ํ๊ฐํฉ๋๋ค.
- ์คํธ๋ ์ค ํ ์คํ : API๋ฅผ ํ๊ณ ์ด์์ผ๋ก ๋ฐ์ด๋ถ์ฌ ์ค๋จ ์ง์ ๊ณผ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํฉ๋๋ค.
- ๋ด๊ตฌ์ฑ ํ ์คํ : ์ฅ๊ธฐ๊ฐ์ ๊ฑธ์ณ API์ ์ฑ๋ฅ์ ํ ์คํธํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ ๊ธฐํ ์ฅ๊ธฐ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํฉ๋๋ค.
REST API ํ ์คํ ๋๊ตฌ
REST API ํ ์คํ ์ ์ํ ์ฌ๋ฌ ๋๊ตฌ๊ฐ ์์ต๋๋ค:
- Postman: API๋ฅผ ์๋์ผ๋ก ํ ์คํธํ๊ธฐ ์ํ ์ธ๊ธฐ ์๋ ๋๊ตฌ๋ก, ์ฌ์ฉ์๊ฐ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต์ ๊ฒ์ฌํ๊ณ , ํ ์คํธ ์ปฌ๋ ์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
- REST-assured: REST API ํ ์คํธ ์๋ํ๋ฅผ ์ํ Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์์ฒญ ์ ์ก ๋ฐ ์๋ต ๊ฒ์ฆ์ ์ํ ์ ์ฐํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Swagger Inspector: API ํธ๋ํฝ์ ๊ฒ์ฌํ๊ณ OpenAPI ๋ช ์ธ๋ฅผ ์์ฑํ๋ ๋๊ตฌ์ ๋๋ค.
- JMeter: REST API์ ๋ถํ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ณ ์๋ต ์๊ฐ๊ณผ ์ฒ๋ฆฌ๋์ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ฑ๋ฅ ํ ์คํธ ๋๊ตฌ์ ๋๋ค.
- Karate DSL: API ํ ์คํธ ์๋ํ, ๋ชจ์(mock) ๊ฐ์ฒด, ์ฑ๋ฅ ํ ์คํธ, ์ฌ์ง์ด UI ์๋ํ๊น์ง ๊ฒฐํฉํ ์คํ์์ค API ํ ์คํธ ์๋ํ ํ๋ ์์ํฌ์ ๋๋ค.
REST API ํ ์คํ ์์
๋์๊ด์์ ์ฑ ์ ๊ด๋ฆฌํ๋ REST API๋ฅผ ์๊ฐํด ๋ด ์๋ค. ์ด API๋ ์ฑ ์ ์์ฑ, ์กฐํ, ์ ๋ฐ์ดํธ, ์ญ์ ํ๋ ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํ ์คํธ ์ผ์ด์ค ์์:
- ์ ์ฑ
์์ฑ:
- `/books`์ POST ์์ฒญ์ ๋ณด๋ด๊ณ ์ฑ ์ธ๋ถ ์ ๋ณด๋ฅผ JSON ํ์์ผ๋ก ์ ๋ฌํฉ๋๋ค.
- ์๋ต ์ํ ์ฝ๋๊ฐ 201 Created์ธ์ง ํ์ธํฉ๋๋ค.
- ์๋ต ๋ณธ๋ฌธ์ ๊ณ ์ ID๊ฐ ์๋ ์๋ก ์์ฑ๋ ์ฑ ์ด ํฌํจ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
- ๊ธฐ์กด ์ฑ
์กฐํ:
- ์กฐํํ ์ฑ ์ ID์ ํจ๊ป `/books/{id}`์ GET ์์ฒญ์ ๋ณด๋ ๋๋ค.
- ์๋ต ์ํ ์ฝ๋๊ฐ 200 OK์ธ์ง ํ์ธํฉ๋๋ค.
- ์๋ต ๋ณธ๋ฌธ์ ์ฑ ์ธ๋ถ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
- ๊ธฐ์กด ์ฑ
์
๋ฐ์ดํธ:
- `/books/{id}`์ PUT ์์ฒญ์ ๋ณด๋ด๊ณ ์ ๋ฐ์ดํธ๋ ์ฑ ์ธ๋ถ ์ ๋ณด๋ฅผ JSON ํ์์ผ๋ก ์ ๋ฌํฉ๋๋ค.
- ์๋ต ์ํ ์ฝ๋๊ฐ 200 OK ๋๋ 204 No Content์ธ์ง ํ์ธํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฑ ์ธ๋ถ ์ ๋ณด๊ฐ ์ ๋ฐ์ดํธ๋์๋์ง ํ์ธํฉ๋๋ค.
- ๊ธฐ์กด ์ฑ
์ญ์ :
- ์ญ์ ํ ์ฑ ์ ID์ ํจ๊ป `/books/{id}`์ DELETE ์์ฒญ์ ๋ณด๋ ๋๋ค.
- ์๋ต ์ํ ์ฝ๋๊ฐ 204 No Content์ธ์ง ํ์ธํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฑ ์ด ์ญ์ ๋์๋์ง ํ์ธํฉ๋๋ค.
GraphQL API ํ ์คํ
GraphQL์ API๋ฅผ ์ํ ์ฟผ๋ฆฌ ์ธ์ด์ด์ ๊ธฐ์กด ๋ฐ์ดํฐ๋ก ํด๋น ์ฟผ๋ฆฌ๋ฅผ ์ํํ๊ธฐ ์ํ ๋ฐํ์์ ๋๋ค. ์ฌ๋ฌ ๋ฆฌ์์ค์ ๋ํด ๋ค์์ ์๋ํฌ์ธํธ๋ฅผ ๋ ธ์ถํ๋ REST API์ ๋ฌ๋ฆฌ, GraphQL API๋ ๋จ์ผ ์๋ํฌ์ธํธ๋ฅผ ๋ ธ์ถํ๊ณ ํด๋ผ์ด์ธํธ๊ฐ ์ฟผ๋ฆฌ์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ฒ ์ง์ ํ ์ ์๋๋ก ํฉ๋๋ค.
GraphQL API ํ ์คํ ๊ธฐ๋ฒ
- ์ฟผ๋ฆฌ ํ
์คํ
:
- ์ ํจํ ์ฟผ๋ฆฌ: ์ ํจํ GraphQL ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ด๊ณ ์๋ต์ ์์ฒญ๋ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
- ์ ํจํ์ง ์์ ์ฟผ๋ฆฌ: ์ ํจํ์ง ์์ GraphQL ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ด๊ณ API๊ฐ ์ ์ ํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐํํ๋์ง ํ์ธํฉ๋๋ค.
- ํ๋ ์ ํ: ์ฟผ๋ฆฌ์์ ๋ค์ํ ํ๋ ์กฐํฉ์ ํ ์คํธํ์ฌ API๊ฐ ๊ฐ ํ๋์ ๋ํด ์ฌ๋ฐ๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋์ง ํ์ธํฉ๋๋ค.
- ๋ณ์นญ(Alias) ํ ์คํ : ๋ณ์นญ์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ์ ํ๋ ์ด๋ฆ์ ๋ฐ๊พธ๊ณ ์๋ต์ ๋ณ์นญ์ด ์ง์ ๋ ํ๋๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
- ๋ฎคํ
์ด์
(Mutation) ํ
์คํ
:
- ์์ฑ ๋ฎคํ ์ด์ : ์ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ ๋ฎคํ ์ด์ ์ ๋ณด๋ด๊ณ ๋ฆฌ์์ค๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋์๋์ง ํ์ธํฉ๋๋ค.
- ์ ๋ฐ์ดํธ ๋ฎคํ ์ด์ : ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฎคํ ์ด์ ์ ๋ณด๋ด๊ณ ๋ฆฌ์์ค๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ ๋ฐ์ดํธ๋์๋์ง ํ์ธํฉ๋๋ค.
- ์ญ์ ๋ฎคํ ์ด์ : ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ๋ ๋ฎคํ ์ด์ ์ ๋ณด๋ด๊ณ ๋ฆฌ์์ค๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ญ์ ๋์๋์ง ํ์ธํฉ๋๋ค.
- ๊ตฌ๋
(Subscription) ํ
์คํ
:
- ๊ตฌ๋ ์ค์ : API๋ก๋ถํฐ ์ค์๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ๊ธฐ ์ํด ๊ตฌ๋ ์ ์ค์ ํฉ๋๋ค.
- ์ด๋ฒคํธ ํธ๋ฆฌ๊ฑฐ: ๊ตฌ๋ ์ด ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ํ๋ ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
- ์ ๋ฐ์ดํธ ํ์ธ: ๊ตฌ๋ ์ด ์์๋ ์ ๋ฐ์ดํธ๋ฅผ ์์ ํ๋์ง ํ์ธํฉ๋๋ค.
- ๋ณด์ ํ
์คํ
:
- ์ธ์ฆ ํ ์คํ : API๊ฐ ์ฟผ๋ฆฌ์ ๋ฎคํ ์ด์ ์ ์คํํ๊ธฐ ์ํด ์ ์ ํ ์ธ์ฆ ์๊ฒฉ ์ฆ๋ช ์ ์๊ตฌํ๋์ง ํ์ธํฉ๋๋ค.
- ๊ถํ ๋ถ์ฌ ํ ์คํ : ์ฌ์ฉ์๊ฐ ์ ๊ทผ ๊ถํ์ด ์๋ ๋ฐ์ดํฐ์๋ง ์ ๊ทผํ ์ ์๋์ง ํ์ธํฉ๋๋ค.
- ์์ฒญ ์๋ ์ ํ(Rate Limiting): ๋จ์ฉ ๋ฐ ์๋น์ค ๊ฑฐ๋ถ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด API์ ์์ฒญ ์๋ ์ ํ ๋ฉ์ปค๋์ฆ์ ํ ์คํธํฉ๋๋ค.
- ์ฑ๋ฅ ํ
์คํ
:
- ์ฟผ๋ฆฌ ๋ณต์ก์ฑ: ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ๋ณต์กํ ์ฟผ๋ฆฌ๋ก API์ ์ฑ๋ฅ์ ํ ์คํธํฉ๋๋ค.
- ์ผ๊ด ์ฒ๋ฆฌ(Batching): ์ผ๊ด ์ฒ๋ฆฌ๋ ์ฟผ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ API์ ๋ฅ๋ ฅ์ ํ ์คํธํฉ๋๋ค.
- ์บ์ฑ(Caching): ์ฑ๋ฅ ํฅ์์ ์ํด API์ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ํ ์คํธํฉ๋๋ค.
GraphQL API ํ ์คํ ๋๊ตฌ
GraphQL API ํ ์คํ ์ ์ํ ์ฌ๋ฌ ๋๊ตฌ๊ฐ ์์ต๋๋ค:
- GraphiQL: GraphQL API๋ฅผ ํ์ํ๊ณ ํ ์คํธํ๊ธฐ ์ํ ๋ธ๋ผ์ฐ์ ๋ด IDE์ ๋๋ค.
- Apollo Client Developer Tools: GraphQL ์ฟผ๋ฆฌ ๋ฐ ๋ฎคํ ์ด์ ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ๋ ๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ์ ๋๋ค.
- Insomnia: ์ฟผ๋ฆฌ์ ๋ฎคํ ์ด์ ์ ๋ณด๋ด๊ธฐ ์ํ ํฌ๋ก์ค ํ๋ซํผ GraphQL ํด๋ผ์ด์ธํธ์ ๋๋ค.
- Supertest: GraphQL API๋ฅผ ํฌํจํ HTTP ์๋ฒ ํ ์คํธ๋ฅผ ์ํ Node.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- GraphQL Faker: GraphQL API๋ฅผ ์ํ ํ์ค์ ์ธ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
GraphQL API ํ ์คํ ์์
์ ์ ์๊ฑฐ๋ ์์ ์์ ์ ํ์ ๊ด๋ฆฌํ๋ GraphQL API๋ฅผ ์๊ฐํด ๋ด ์๋ค. ์ด API๋ ์ ํ ์กฐํ๋ฅผ ์ํ ์ฟผ๋ฆฌ์ ์ ํ ์์ฑ, ์ ๋ฐ์ดํธ, ์ญ์ ๋ฅผ ์ํ ๋ฎคํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
ํ ์คํธ ์ผ์ด์ค ์์:
- ์ ํ ์กฐํ:
- ID๋ก ์ ํ์ ์กฐํํ๋ GraphQL ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ ๋๋ค.
- ์๋ต์ ์ ํ ์ธ๋ถ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
- ์ ์ ํ ์์ฑ:
- ์ ์ ํ์ ์์ฑํ๋ GraphQL ๋ฎคํ ์ด์ ์ ๋ณด๋ ๋๋ค.
- ์๋ต์ ์๋ก ์์ฑ๋ ์ ํ ์ธ๋ถ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
- ๊ธฐ์กด ์ ํ ์
๋ฐ์ดํธ:
- ๊ธฐ์กด ์ ํ์ ์ ๋ฐ์ดํธํ๋ GraphQL ๋ฎคํ ์ด์ ์ ๋ณด๋ ๋๋ค.
- ์๋ต์ ์ ๋ฐ์ดํธ๋ ์ ํ ์ธ๋ถ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
- ๊ธฐ์กด ์ ํ ์ญ์ :
- ๊ธฐ์กด ์ ํ์ ์ญ์ ํ๋ GraphQL ๋ฎคํ ์ด์ ์ ๋ณด๋ ๋๋ค.
- ์๋ต์ ์ ํ์ด ์ญ์ ๋์์์ด ํ์๋๋์ง ํ์ธํฉ๋๋ค.
API ํ ์คํ ๋ชจ๋ฒ ์ฌ๋ก
ํจ๊ณผ์ ์ธ API ํ ์คํ ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ํ ์คํธ ์๋ํ: API ํ ์คํธ๋ฅผ ์๋ํํ์ฌ ์๋ ์์ ์ ์ค์ด๊ณ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ฐ์ ํฉ๋๋ค. REST-assured, Supertest ๋๋ Karate DSL๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ์กฐ๊ธฐ์ ์์ฃผ ํ ์คํธ: API ํ ์คํ ์ ๊ฐ๋ฐ ์๋ช ์ฃผ๊ธฐ์ ํตํฉํ๊ณ ํ ์คํธ๋ฅผ ์์ฃผ ์คํํ์ฌ ๊ฒฐํจ์ ์กฐ๊ธฐ์ ์๋ณํฉ๋๋ค.
- ํ์ค์ ์ธ ๋ฐ์ดํฐ ์ฌ์ฉ: ํ ์คํธ์ ํ์ค์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ์๋๋ฆฌ์ค๋ฅผ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค.
- ์ฃ์ง ์ผ์ด์ค ํ ์คํธ: ์ฃ์ง ์ผ์ด์ค์ ๊ฒฝ๊ณ ์กฐ๊ฑด์ ํ ์คํธํ์ฌ API๊ฐ ์์์น ๋ชปํ ์ ๋ ฅ์ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋์ง ํ์ธํฉ๋๋ค.
- ํ ์คํธ ๋ฌธ์ํ: API ํ ์คํธ๋ฅผ ๋ฌธ์ํํ์ฌ ์ดํดํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- API ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ์ด์ ํ๊ฒฝ์์ API ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ์ฌ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ฅํฉ๋๋ค.
- ๊ณ์ฝ ํ ์คํธ ์ฌ์ฉ: ๊ณ์ฝ ํ ์คํธ(์: Pact ์ฌ์ฉ)๋ฅผ ์ฌ์ฉํ์ฌ API๊ฐ ์ ๊ณต์์ ์๋น์ ๊ฐ์ ์ ์๋ ๊ณ์ฝ์ ์ค์ํ๋์ง ํ์ธํ๊ณ ํตํฉ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- API ๋ณด์ ๊ณ ๋ ค: API ๋ณด์ ํ ์คํ ์ ์ฐ์ ์ํ์ฌ ์ทจ์ฝ์ ์ ์๋ณํ๊ณ ์ํํฉ๋๋ค. ์ ๊ธฐ์ ์ผ๋ก ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ฒํ ํ๊ณ ์นจํฌ ํ ์คํธ๋ฅผ ์ํํฉ๋๋ค.
- API ๋ฌธ์ ์ค์: ํญ์ API ๋ฌธ์๋ฅผ ์ค์ํ์ญ์์ค. ๋ฌธ์์ ์ผ์นํ๊ณ ๋ฌธ์๋ฅผ ๊ฒ์ฆํ๋ ํ ์คํธ๋ฅผ ๋ง๋ญ๋๋ค.
๊ฒฐ๋ก
API ํ ์คํ ์ ํ๋ ์ํํธ์จ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ขฐ์ฑ, ์ฑ๋ฅ ๋ฐ ๋ณด์์ ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. REST ๋ฐ GraphQL API์ ํน์ ํน์ฑ์ ์ดํดํ๊ณ ์ ์ ํ ํ ์คํ ๊ธฐ๋ฒ์ ์ ์ฉํจ์ผ๋ก์จ ์ฌ์ฉ์์ ์ดํด ๊ด๊ณ์์ ์๊ตฌ๋ฅผ ์ถฉ์กฑํ๋ ๊ฐ๋ ฅํ๊ณ ์ ๋ขฐํ ์ ์๋ API๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์๋ํ๋ ํ ์คํธ, ๊ณ์ฝ ํ ์คํธ ๋ฐ ๋ณด์ ํ ์คํธ๋ฅผ API ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ํตํฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ง๊ณผ ์์ ์ฑ์ด ํฌ๊ฒ ํฅ์๋ ๊ฒ์ ๋๋ค. ํ๋ก์ ํธ์ ํน์ ์๊ตฌ ์ฌํญ๊ณผ ์ ์ฝ ์กฐ๊ฑด์ ๋ง๊ฒ ํ ์คํธ ์ ๋ต์ ์กฐ์ ํ๊ณ ์ ์ ํ ๋๊ตฌ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํ์ฉํ์ฌ ์ต์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฌ์ฑํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
ํฌ๊ด์ ์ธ API ํ ์คํ ์ ์ง์์ ์ผ๋ก ํฌ์ํ๋ ๊ฒ์ ์ํํธ์จ์ด ์ํ๊ณ์ ๋ฏธ๋ ์ฑ๊ณต์ ํฌ์ํ๋ ๊ฒ์ ๋๋ค.